/* 
 * File:   StaticObject.cpp
 * Author: Piotrek
 * 
 * Created on 12 czerwiec 2010, 14:54
 */
#include "stdafx.h"
#include "StaticObject.h"
#include "CollisionDetection.h"
#include "Utils.h"

StaticObject::StaticObject() {}

StaticObject::StaticObject(RobotCollisionXmlDoc^ xmlDoc, System::String^ globalFilepath){

	// zwykle modules :)
	if (xmlDoc->mdModulesData){
		for (int i = 0; i < xmlDoc->mdModulesData->Length; i++){
			for (int j = 0; j < xmlDoc->mdModulesData[i]->submodules->Length; j++){
				char* plik = static_cast<char*>(System::Runtime::InteropServices::Marshal::StringToHGlobalAnsi(globalFilepath+"/"+xmlDoc->mdModulesData[i]->submodules[j]->submoduleFilepath).ToPointer());
				modules.push_back(Module(plik));
				if (modules.back().triangles.size() == 0)
				{
					Logger::InsertWarningMessage("Usuniecie pustego modulu");
					modules.pop_back();
					continue;
				}
				// gdy istnieje transform tag:
				if (xmlDoc->mdModulesData[i]->submodules[j]->transformTag) {
					for (int k = 0; k < xmlDoc->mdModulesData[i]->submodules[j]->transformTag->Length; k++){
						float X, Y, Z, r;
						char* axis;
						try {
							X = StringHandleToFloat(xmlDoc->mdModulesData[i]->submodules[j]->transformTag[k]->X);
							Y = StringHandleToFloat(xmlDoc->mdModulesData[i]->submodules[j]->transformTag[k]->Y);
							Z = StringHandleToFloat(xmlDoc->mdModulesData[i]->submodules[j]->transformTag[k]->Z);
							r = StringHandleToFloat(xmlDoc->mdModulesData[i]->submodules[j]->transformTag[k]->R);
							axis = static_cast<char*>(System::Runtime::InteropServices::Marshal::StringToHGlobalAnsi(xmlDoc->mdModulesData[i]->submodules[j]->transformTag[k]->axis).ToPointer());

							/// @todo tymczasowo z ta 1 na koncu
							modules.back().transform(X,Y,Z,*axis,r,I,T0,1);			
						} catch (...) {
							Logger::InsertErrorMessage("Blad przy wczytywaniu nowego StaticObject. Najprawdopodobniej zaszedł błąd konwersji.");
						}
					}
				}
			}
		}
	} 
	// cubed modules :)
	if (xmlDoc->cmdModulesData){
		for (int i = 0; i < xmlDoc->cmdModulesData->Length; i++){
			float X, Y, Z, A, B, C;
			int concave = 1;
			
			try  {
				X = StringHandleToFloat(xmlDoc->cmdModulesData[i]->X);
				Y = StringHandleToFloat(xmlDoc->cmdModulesData[i]->Y);
				Z = StringHandleToFloat(xmlDoc->cmdModulesData[i]->Z);
				A = StringHandleToFloat(xmlDoc->cmdModulesData[i]->A);
				B = StringHandleToFloat(xmlDoc->cmdModulesData[i]->B);
				C = StringHandleToFloat(xmlDoc->cmdModulesData[i]->C);
				if (xmlDoc->cmdModulesData[i]->isConcave)
					concave = -1;
				
				// dodanie modułu
				modules.push_back(Module(X, Y, Z, A, B, C, concave));
				modules.back().transform(I, T0);

			} catch (...){
				// jakis error - blizej nieokreslony
				Logger::InsertErrorMessage("Wystąpil blad poczas wczytywanie statycznego obiektu. Najprawdopodobniej błąd jest spowodowany niepoprawną konwersją z typu String^ na typ float.");
			}
		}
	}
	// kolory :
	
	try {
		objectColor.R = StringHandleToFloat(xmlDoc->rgbParameters->R);
		objectColor.G = StringHandleToFloat(xmlDoc->rgbParameters->G);
		objectColor.B = StringHandleToFloat(xmlDoc->rgbParameters->B);
		objectColor.alpha = StringHandleToFloat(xmlDoc->rgbParameters->alphaBlend);	
	} catch (...){
		Logger::InsertErrorMessage("Wystapil nieznany blad zwiazany z konwersja typu string na typ int. Najprawdopodobniej podano zle wartosci w pliku xml, dokładniej : w tagu Vizualization.");
	}
	InitializeCollisionDetectionModel();            
	isRobot = false;
}


void StaticObject::draw(float R, float G, float B, float alpha)
{
    unsigned int i;

    #ifdef LIGHT1
    float color[3];
    #endif

	// najpierw nieprzezroczyste
    for (i=0;i<modules.size();i++)
    {
        if (collidedModule==(int)i)
        {
            #ifdef LIGHT1
            color[0]=1-R; color[1]=1-G; color[2]=1-B;
            glMaterialfv(GL_FRONT, GL_AMBIENT, color);
            #else
            glColor4f(1-R,1-G,1-B,alpha);
            #endif
        }
        else
        {
            #ifdef LIGHT1
            color[0]=R; color[1]=G; color[2]=B;
            glMaterialfv(GL_FRONT, GL_AMBIENT, color);
            #else
            glColor4f(R,G,B,alpha);
            #endif
        }

        modules[i].drawModule();
    }

	// teraz przezroczyste
	if (drawCubedModules())
	{
		for (i=0; i<modules.size(); i++)
		{
			glColor4f(1.0f,1.0f,1.0f,0.3f);
			modules[i].drawCubedModule();			
		}
	}
}

bool StaticObject::drawCubedModules() const {
	return false;
}
